package com.atguigu.spring.dao;

import com.atguigu.spring.util.JDBCUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

// 在master分支中 测试冲突（实际实在hotfix分支 写反了）
public class BaseDao {

    private QueryRunner queryRunner = new QueryRunner();

    /**
     * 通用的增删改方法
     * @param sql 带有问号占位符的 SQL 语句
     * @param params 给 SQL 语句中问号占位符传入的参数
     * @return 返回受影响的行数
     */
    public int commonUpdate(String sql, Object ... params) {

        Connection connection = JDBCUtil.getConnection();

        try {
            return queryRunner.update(connection, sql, params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtil.closeConnection(connection);
        }
    }

    // 在 hot_fix 分支下修改代码
    /**
     * 通用查询方法，返回单个查询结果
     * @param sql 带有问号占位符的 SQL 语句
     * @param entityTpe 封装查询结果的实体类类型
     * @param params 给 SQL 语句中问号占位符传入的参数
     * @return 查询结果
     * @param <T> 对应实体类类型的泛型参数
     */
    public <T> T selectOne(String sql, Class<T> entityTpe, Object ... params) {
        Connection connection = JDBCUtil.getConnection();
        try {
            return queryRunner.query(connection, sql, new BeanHandler<>(entityTpe), params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtil.closeConnection(connection);
        }
    }

    /**
     * 通用查询方法，返回集合查询结果
     * @param sql 带有问号占位符的 SQL 语句
     * @param entityTpe 封装查询结果的实体类类型
     * @param params 给 SQL 语句中问号占位符传入的参数
     * @return 查询结果
     * @param <T> 对应实体类类型的泛型参数
     */
    public <T> List<T> selectList(String sql, Class<T> entityTpe, Object ... params) {
        Connection connection = JDBCUtil.getConnection();
        try {
            return queryRunner.query(connection, sql, new BeanListHandler<>(entityTpe), params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtil.closeConnection(connection);
        }
    }

    /**
     * 通用查询方法，返回单个值查询结果
     * @param sql 带有问号占位符的 SQL 语句
     * @param params 给 SQL 语句中问号占位符传入的参数
     * @return 查询结果
     * @param <V> 对应单个值类型的泛型参数
     */
    public <V> V selectSingleValue(String sql, Object ... params) {
        Connection connection = JDBCUtil.getConnection();
        try {
            return queryRunner.query(connection, sql, new ScalarHandler<>(), params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtil.closeConnection(connection);
        }
    }
}